/*
 * SAXErrorHandler.java
 *
 * Created on February 14, 2001, 4:38 PM
 */

package org.freehep.xml.util;

import org.geogebra.common.util.debug.Log;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * A simple SAXErrorHandler. Reports errors to System.err and keeps track of the
 * most severe error. Can be configured to throw exceptions when errors more
 * severe than a certain LEVEL are encountered
 * 
 * @author tonyj
 * @version $Id: SAXErrorHandler.java,v 1.5 2008-10-23 19:04:05 hohenwarter Exp
 *          $
 */
public class SAXErrorHandler implements ErrorHandler {
	public final static int LEVEL_SUCCESS = 0;
	public final static int LEVEL_WARNING = 1;
	public final static int LEVEL_ERROR = 2;
	public final static int LEVEL_FATAL = 3;

	/**
	 * Create a SAXErrorHandler which will throw exceptions for all errors (but
	 * not warnings)
	 */
	public SAXErrorHandler() {
		this(LEVEL_ERROR);
	}

	/**
	 * Create a SAXErrorHandler
	 * 
	 * @param minLevelForException
	 *            The minimum error level for which exceptions will be thrown
	 */
	public SAXErrorHandler(int minLevelForException) {
		this.minLevel = minLevelForException;
	}

	@Override
	public void warning(SAXParseException exception)
			throws org.xml.sax.SAXException {
		handle(exception, LEVEL_WARNING, "Warning");
	}

	@Override
	public void error(SAXParseException exception)
			throws org.xml.sax.SAXException {
		handle(exception, LEVEL_ERROR, "Error");
	}

	@Override
	public void fatalError(SAXParseException exception) throws SAXException {
		handle(exception, LEVEL_FATAL, "Fatal");
	}

	private void handle(SAXParseException exception, int level,
			String levelName) throws SAXException {
		StringBuffer message = new StringBuffer(levelName);
		String fileName = exception.getPublicId();
		if (fileName == null) {
			fileName = exception.getSystemId();
		}
		if (fileName != null) {
			message.append(" at " + fileName);
		}
		message.append(" line " + exception.getLineNumber());
		if (level > maxLevel) {
			maxLevel = level;
		}
		if (level >= minLevel) {
			throw new BadXMLException(message.toString(), exception);
		}
		message.append(": " + exception);
		Log.debug(message + "");

	}

	/**
	 * Get the level of the most severe error.
	 * 
	 * @return one of LEVEL_SUCCESS, LEVEL_WARNING, LEVEL_ERROR, LEVEL_FATAL
	 */
	public int getErrorLevel() {
		return maxLevel;
	}

	private int maxLevel = 0;
	private int minLevel;
}
